package com.work.daily.stream;

import com.work.daily.stream.data.Person;

import java.util.DoubleSummaryStatistics;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * Stream 的收集(collect)
 * collect，收集，可以说是内容最繁多、功能最丰富的部分了。从字面上去理解，就是把一个流收集起来，
 * 最终可以是收集成一个值也可以收集成一个新的集合。
 *
 * @author Shengkang.Mo
 * @create 2020-11-27 15:55
 * <p>
 * 统计(count/averaging)
 * Collectors提供了一系列用于数据统计的静态方法：
 * <p>
 * 计数：count
 * 平均值：averagingInt、averagingLong、averagingDouble
 * 最值：maxBy、minBy
 * 求和：summingInt、summingLong、summingDouble
 * 统计以上所有：summarizingInt、summarizingLong、summarizingDouble
 */
public class Stream_7_2 {
    public static void main(String[] args) {
        //统计员工人数、平均工资、工资总额、最高工资。
        List<Person> personList = Person.initData();

        //求总数
        Long count = personList.stream().collect(Collectors.counting());
        System.out.println("员工总人数：" + count);

        //求平均工资
        Double average = personList.stream().collect(Collectors.averagingDouble(Person::getSalary));
        System.out.println("员工平均工资：" + average);

        //求最高工资
        Optional<Integer> maxSalary = personList.stream().map(Person::getSalary).collect(Collectors.maxBy(Integer::compare));
        System.out.println("员工最高工资：" + maxSalary.get());

        //求工资之和
        Integer sumSalary = personList.stream().collect(Collectors.summingInt(Person::getSalary));
        System.out.println("员工工资总和：" + sumSalary);

        //一次性统计所有信息
        DoubleSummaryStatistics doubleSummaryStatistics = personList.stream().collect(Collectors.summarizingDouble(Person::getSalary));
        System.out.println("员工工资所有统计：" + doubleSummaryStatistics);
    }
}
